package com.ag.oa.core.dao;

import com.ag.oa.core.entity.vo.UserVO;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;

import java.util.List;
import java.util.Map;

@Repository("messageDao")
public interface IMessageDao {

    int getUnreadMessageCount(@Param("userId") Integer userId);

    List<Map> getUserMessagesData(@Param("userId") Integer userId, @Param("isRead") Integer isRead
            , @Param("offset") Integer offset, @Param("pageSize") Integer pageSize);

    /**
     * 保存一条消息记录
     * @param type 消息类型：1:会员申请, 2:任务领取, 3:任务完成, 4:收到指派, 5:收到完成, 6:项目邀请, 7:用户反馈, 8:系统私信, 9:系统通知
     * @param fromUserId 谁发送的
     * @param toUserIdList 接收人（可外部传入，也可方法内查询得出，允许 null）
     * @param taskId 任务id（部分消息不涉及，允许null）
     * @param remark 消息内容
     * @param completeScore 任务完成奖励积分 (部分消息不涉及，允许0)
     * @param batchId 消息的批次id(同一消息多人接收，由于区分是否同一批次)
     * @param projectId 项目id (部分消息不涉及，允许null)
     * @param status 处理状态 (部分消息不涉及，允许0)
     * @param feedbackId 用户反馈id (部分消息不涉及，允许null)
     */
    void saveNewMessage(@Param("type") Integer type, @Param("fromUserId") Integer fromUserId,
                        @Param("toUserIdList") List<Integer> toUserIdList, @Param("taskId") Integer taskId,
                        @Param("remark") String remark, @Param("completeScore") Integer completeScore,
                        @Param("batchId") String batchId, @Param("projectId") Integer projectId,
                        @Param("status") Integer status, @Param("feedbackId") Integer feedbackId);

    Map<String, Object> getInfoById(@Param("id") Integer id);

    void updateToRead(@Param("id") Integer id);

    void updateHandleStatusById(@Param("id") Integer id, @Param("status") Integer status);

    List<Map> getUserTaskAllForumMessagesData(@Param("taskId") Integer taskId);

    /**
     * 修改任务用户的完成奖励积分
     *
     * 多个负责人审批时候，只允许分配一次
     * 任务完成通知，负责人同意，分配完成任务
     * @param completeScore
     * @param updatedBy
     * @param taskId
     * @param userId
     * @param taskType
     * @param taskScore
     * @return taskId与userId可以标识唯一，匹配行数0表示，相关任务负责人已审批 或 当前分配的积分 已超出 任务总积分
     */
    Integer updateTaskUserCompleteScore(@Param("completeScore") Integer completeScore, @Param("updatedBy") Integer updatedBy,
                                        @Param("taskId") Integer taskId, @Param("userId") Integer userId,
                                        @Param("taskType") Integer taskType, @Param("taskScore") Integer taskScore);

    /**
     * 修改消息的完成奖励积分
     */
    void updateMessageCompleteScore(@Param("completeScore") Integer completeScore, @Param("messageId") Integer messageId);

    /**
     * 获取消息，最后处理的负责人信息
     * 用来识别 消息多发情况，其中一个负责已处理，其余负责人则无需处理
     * 处理状态, 1：同意
     * @param messageId
     * @return 如果有值，则表示已处理
     */
    UserVO getMessageLastUpdateManagerInfo(@Param("messageId") Integer messageId);

//    MessageVO getInvitedMessageStatus(@Param("type") Integer type, );

}
